package db

import (
	"database/sql"
	"fmt"
	"github.com/jmoiron/sqlx"
	"server/public"

	_ "github.com/go-sql-driver/mysql"
)

/*
*  -*- coding:utf8 -*-
*
*  mysql 数据库操作相关实例
*
*  @Author  : chengms
*  @WebSite : chengms.com
*  @Email   : chengms2012@163.com
*  @TIME    : 2020/8/16 下午9:09
*  @File    : mysql.go
 */

type mySqlDatabase struct {
	Bb *sqlx.DB
}

var MysqlDb = mySqlDatabase{}

func InitMysql() {
	var err error
	base := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True", "myapp", "123456", "127.0.0.1", 3306, "myapps")
	MysqlDb.Bb, err = sqlx.Connect("mysql", base)
	if err != nil {
		public.Loggerf.Errorf("Connect mysql err: %v", err)
		panic(err)
	}
}

func (m *mySqlDatabase) CloseDataBase() {
	_ = m.Bb.Close()
}

// 创建表
func (m *mySqlDatabase) CreateTable(sql string) error {
	_, err := m.Bb.Exec(sql)
	if err != nil {
		public.Loggerf.Errorf("Create table err: ", err)
	}
	return err
}

// 插入数据
func (m *mySqlDatabase) Insert(sql string, args ...interface{}) (res sql.Result, err error) {
	res, err = m.Bb.Exec(sql, args...)
	if err != nil {
		public.Loggerf.Errorf("Insert data err: ", err)
	}
	return
}

// 修改数据
func (m *mySqlDatabase) Update(sql string, args ...interface{}) (res sql.Result, err error) {
	res, err = m.Bb.Exec(sql, args...)
	if err != nil {
		public.Loggerf.Errorf("Update data err: ", err)
	}

	return
}

// 删除记录
func (m *mySqlDatabase) Delete(sql string, args ...interface{}) (res sql.Result, err error) {
	res, err = m.Bb.Exec(sql, args...)
	if err != nil {
		public.Loggerf.Errorf("Delete data err: ", err)
	}

	return
}

// 删除表
func (m *mySqlDatabase) DeleteTable(sql string, args ...interface{}) (res sql.Result, err error) {
	tx, err := m.Bb.Begin()
	if err != nil {
		public.Loggerf.Errorf("transaction err: ", err)
	}
	res, err = tx.Exec(sql, args...)
	if err != nil {
		public.Loggerf.Errorf("DeleteTable err: ", err)
		_ = tx.Rollback()
	}

	return
}

// 查询数据
func (m *mySqlDatabase) Query(sql string, args ...interface{}) (rows *sql.Rows, err error) {
	rows, err = m.Bb.Query(sql, args...)
	if err != nil {
		public.Loggerf.Errorf("Query data err: ", err)
	}

	return
}

func (m *mySqlDatabase) QueryCount(sql string, args ...interface{}) (count int, err error) {
	err = m.Bb.QueryRow(sql, args...).Scan(&count)
	if err != nil {
		public.Loggerf.Errorf("Query data err: ", err)
	}

	return
}
